home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / pda.h.z / pda.h
C/C++ Source or Header  |  1992-04-03  |  9KB  |  274 lines

  1. /**************************************************************************
  2.  *                                      *
  3.  *          Copyright (C) 1986, Silicon Graphics, Inc.          *
  4.  *                                      *
  5.  *  These coded instructions, statements, and computer programs  contain  *
  6.  *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
  7.  *  are protected by Federal copyright law.  They  may  not be disclosed  *
  8.  *  to  third  parties  or copied or duplicated in any form, in whole or  *
  9.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  10.  *                                      *
  11.  **************************************************************************/
  12. #ifndef __SYS_PDA_H__
  13. #define __SYS_PDA_H__
  14.  
  15. #ident "$Revision: 3.49 $"
  16.  
  17. /*
  18.  * The private data area for each processor
  19.  * Always appears at the same virtual address in each processor
  20.  * It is one page 4K large, and we use the top section as a boot/idle stack
  21.  */
  22.  
  23.  
  24. /*
  25.  * the pda itself
  26.  */
  27. typedef struct pda_s {
  28.     union {
  29.         int    dbg[4];
  30.         struct {
  31.         int    *utlbmiss;    /* utlbmiss handler */
  32.         int    *exceptnorm;    /* general exception handler */
  33.         int    filler[2];
  34.         } common;
  35.     } db;
  36.     int        p_cpuid;    /* my processor ID */
  37.     int        p_cpumask;    /* my processor ID mask */
  38.     int        p_runrun;    /* switch on return to user */
  39.     uint        p_kstackflag;    /* kernel stack flag */
  40.     caddr_t        p_intstack;    /* base of interrupt stack */
  41.     caddr_t        p_intlastframe;    /* last frame on interrupt stack */
  42.     caddr_t        p_bootstack;    /* base of boot/idle stack */
  43.     caddr_t        p_bootlastframe;/* last frame on boot/idle stack */
  44.     int        p_nested_intr;    /* in nested interrupt */
  45.     int        p_atsave;
  46.     int        p_t0save;
  47.  
  48.     /* fields for segment table manipulation */
  49.     int        p_k1save;    /* save k1 */
  50.     caddr_t        *p_gsegtbl;    /* global segment table */
  51.  
  52.     caddr_t        p_idlstkdepth;    /* store sp on interrupt on idl stack */
  53.     int        p_flags;    /* various flags */
  54.     struct proc    *p_curproc;    /* current process */
  55.     int         p_curpri;    /* current priority */
  56.     struct proc    *p_lastproc;    /* last process */
  57.     int        p_ignore;    /* last process ignored by parent */
  58.     int        p_cputype_word;    /* cpu rev */
  59.     int        p_fputype_word;    /* fpu rev */
  60.     int        p_nofault;    /* processor nofaults */
  61.     caddr_t        p_kvfault;    /* processor kernel fault history */
  62.     struct proc    *p_fpowner;    /* process owning fpu */
  63.     int        p_switching;    /* processor in swtch */
  64.     int        p_idleflag;    /* processor idle */
  65.     int        p_idletkn;    /* reasons of processor idle */
  66.     int        p_lticks;    /* ticks left in time slice */
  67.     int        p_vmeipl;    /* non-kmode VME interrupt level */
  68.     int        p_curlock;    /* address of lock cpu is going after */
  69.     int        p_lastlock;    /* addr of last lock locked */
  70.     int        p_curlockcpc;    /* calling pc */
  71.     int        p_savespl;    /* previous spl of spsemahi */
  72.     int        p_gfx_waitc;    /* waiting for gfx context swtch */
  73.     int        p_gfx_waitf;    /* waiting for gfx fifo */
  74.     unsigned    *prfptr;    /* ptr to profiler count table */
  75.     struct ksa    *ksaptr;    /* ptr to kernel system activities buf*/
  76.     struct action_s *p_todolist;    /* list of actions to do for others */
  77.     struct action_s *p_lasttodo;    /* last actions to do for others */
  78.     int        p_triggersave;  /* 3-way trigger state (IP5 only) */
  79.     /*
  80.      * Local LED pattern maintainence.
  81.      */
  82.     unsigned     p_led_counter;
  83.     unsigned    p_led_value;
  84.  
  85.     unsigned    p_dbgcntdown;    /* ticks between debugger checks */
  86.     /*
  87.      * Special modifications lock.  Used to allow other processors
  88.      * to change p_flags or p_vmeipl (to distribute functionality).
  89.      */
  90.     lock_t        p_special;
  91.     int        p_cputype;    /* 0 for IP7, 1 for IP5 (MP only) */
  92.  
  93.     /* data needed for updating timetv via fast clock */
  94.     int        p_fastick;
  95.     /* for handling timein */
  96.     int        p_timein;    /* set by timepoke */
  97.     int        p_ftimein;    /* set by fast_timnepoke */
  98.  
  99.     int        fclock_freq;    /* freq of profiling clock */
  100.     int        p_schedflags;    /* scheduling flags mod by owner only */
  101.     struct shaddr_s    *p_dispatch;    /* Share group to dispatch member of */
  102.     uint        p_acvec;    /* opcode vector for cpuvaction() */
  103.     uint        p_delayacvec;    /* opcode vector for delay action */
  104.     uint        p_upglo;    /* tlblo entry for upage */
  105.     uint        p_ukstklo;    /* tlblo entry for ukstk */
  106.     uint        p_utlbmisses;    /* count utlbmisses */
  107.     uint        p_sv1lo;    /* tlblo entry for save of slot 1 */
  108.     uint        p_sv1lo_1;    /* r4k: 2nd tlblo entry for slot 1 */
  109.     uint        p_sv1hi;    /* tlbhi entry for save of slot 1 */
  110.     uint        p_sv2lo;    /* tlblo entry for save of slot 2 */
  111.     uint        p_sv2lo_1;    /* r4k: 2nd tlblo entry for slot 2 */
  112.     uint        p_sv2hi;    /* tlbhi entry for save of slot 2 */
  113.  
  114.     /* data needed to handle IO intr */
  115.     uint        *ioep[2];    /* exception frame ptr */
  116.     int        iopend[2];    /* accumulated io pending bits */
  117.     int        preempted_iolv[2]; /* io levels being preempted */
  118.  
  119.     /* delay calibration info */
  120.     int         decinsperloop;  /* deci-nanoseconds per DELAY loop  */    
  121.  
  122.     /* floating point interrupt data */
  123.     int        p_epcinst;    /* instruction at epc */
  124.     int        p_bdinst;    /* instruction in bd slot */
  125. } pda_t;
  126.  
  127. /*
  128.  * sysmp(MP_STAT) structure
  129.  */
  130. struct pda_stat {
  131.     int        p_cpuid;    /* processor ID */
  132.     int        p_flags;    /* various flags */
  133. };
  134.  
  135. #define    common_utlb        db.common.utlbmiss
  136. #define    common_excnorm        db.common.exceptnorm
  137.  
  138. /* a couple of macros for readability in fast itimer code */
  139. #define NORMTIMEOUT_LIST    0
  140. #define FASTTIMEOUT_LIST    -1 /* must be >MAXCPU or <0 */
  141.  
  142. /* values for p_flags */
  143. #define PDAF_MASTER    0x0001
  144. #define PDAF_CLOCK    0x0002
  145. #define PDAF_ENABLED    0x0004        /* processor allowed to sched procs */
  146. #define    PDAF_FASTCLOCK    0x0008        /* processor handles fastimer */
  147. #define PDAF_ISOLATED    0x0010        /* processor is isolated */
  148. #define PDAF_BROADCAST_OFF    0x0020    /* broadcast intr is not received */
  149. #define PDAF_NONPREEMPTIVE    0x0040    /* processor is not preemptive */
  150.  
  151. /* ``run-anywhere'' value for p_mustrun */
  152. #define PDA_RUNANYWHERE        ((cpuid_t)-1)
  153.  
  154. /* values for kstackflag */
  155. #define PDA_CURUSRSTK        0 /* currently running on user stack */
  156. #define PDA_CURKERSTK        1 /* currently running on kernel user stack */
  157. #define PDA_CURINTSTK        2 /* currently running on interrupt stack */
  158. #define PDA_CURIDLSTK        3 /* currently running on idle stack */
  159.  
  160. /* values for p_schedflags */
  161. #define    PDAS_KICKIDLE    0x0001    /* do a kickidle later */
  162.  
  163. typedef struct {
  164.     int    CpuId;
  165.     pda_t    *pda;
  166.     int    spare;
  167. } pdaindr_t;
  168.  
  169. #ifdef _KERNEL
  170. extern pdaindr_t    pdaindr[];
  171. extern int    numcpus;    /* count of configured cpus */
  172. extern int    maskcpus;    /* mask of configured cpus */
  173. extern int    maxcpus;    /* max configured cpus */
  174. extern pda_t    *masterpda;    /* master processor's pda */
  175. extern cpuid_t getcpuid(void);
  176. extern cpuid_t setmustrun(cpuid_t);
  177. extern void restoremustrun(cpuid_t);
  178. extern int sendintr(cpuid_t, unchar);
  179. #endif
  180.  
  181. #define PDASZ        1        /* # pages of pda */
  182.  
  183. #define    getpda()    ((pda_t *) PDAPAGE)
  184. #define    private        (*((pda_t *) PDAPAGE))
  185. #define    cpuid()        ((cpuid_t)(private.p_cpuid))
  186. #define    cpumask()    (private.p_cpumask)
  187. #define ON_MP(X)    if (maxcpus > 1) {X;}
  188. #define IS_MP        (maxcpus > 1)
  189.  
  190. #ifdef _KERNEL
  191. /*
  192.  * The following allows other cpus to do things for you 
  193.  */
  194. typedef struct action_s {
  195.     void (*dofunc)();
  196.     void *doarg0;
  197.     void *doarg1;
  198.     void *doarg2;
  199.     void *doarg3;
  200.     struct action_s *donext;
  201. } action_t;
  202.  
  203. void cpuaction(cpuid_t, void (*)(), int , ...);
  204. extern void doactions(void);
  205. extern void cpuvaction(register cpuid_t, register uint);
  206. extern void doacvec(void);
  207. extern void da_flush_tlb(void);
  208.  
  209. #define    A_NOW        0x0001    /* perform this action NOW */
  210. #define A_QUEUE        0x0002    /* perform this action later (at disp time) */
  211. #define    DOACTION    0xab    /* argument for sendintr() to do actions */
  212.  
  213. /* Opcodes for the cpu action vector */
  214. #define    VA_FORCE_RESCHED    0x4
  215. #define    VA_TRY_GANGSCHED    0x8
  216. #define    VA_LAST_OP        VA_TRY_GANGSCHED
  217.  
  218. /* Opcodes for the cpu delay action vector */
  219. #define    DA_ICACHE_FLUSH        0x1
  220. #define    DA_TLB_FLUSH        0x2
  221. #define    DA_LAST_OP        DA_TLB_FLUSH
  222.  
  223. /*
  224.  * Process tlb management
  225.  */
  226. #if R4000 && JUMP_WAR
  227. extern uint max_jump_war_wired;
  228. extern uint jump_war_set;
  229. #endif
  230. extern lock_t    tlbflushlock;    /* mp tlb flush lock */
  231. extern unsigned char    tlbpids[];    /* array of NPROC * MAXCPU tlbpids */
  232.                 /* these are the array of tlbpids in use */
  233.                 /* by each process on different processors */
  234.                 /* can't be 2-dimensional array since    */
  235.                 /* NPROC and MAXCPU are both tuneable    */
  236. extern unsigned char    cur_tlbpid[];    /* array of last tlbpids assigned */
  237.  
  238. #define tlbpid(p)        (*((p)->p_tlbpid + cpuid()))
  239. extern void check_delay_tlbflush(int);
  240. extern void check_delay_iflush(void);
  241.  
  242. /*
  243.  * tlbsync() flags
  244.  */
  245. #define TLB_NOSLEEP        0x01
  246. #define STEAL_PHYSMEM        0x02
  247. #define NO_VADDR        0x04
  248. #define SPROC_TLBSYNC        0x08
  249. #define IMMEDIATE_BROADCAST    0x10
  250.  
  251. /* 
  252.  * process that is must run on isolated processor will not be paged out, nor
  253.  * killed by sched()
  254.  */
  255. #define is_isolated(p)    (p->p_mustrun != PDA_RUNANYWHERE && \
  256.              pdaindr[p->p_mustrun].pda->p_flags & PDAF_ISOLATED)
  257.  
  258. /* flags for check_delay_tlbflush() */
  259. #define ENTRANCE    0
  260. #define EXIT    1
  261. #define CHECK_DELAY_TLBFLUSH(flag)    {\
  262.     if (private.p_flags & PDAF_ISOLATED) \
  263.         check_delay_tlbflush(flag); \
  264.     }
  265.  
  266. #define CHECK_DELAY_IFLUSH()    {\
  267.     if (private.p_flags & PDAF_ISOLATED) \
  268.         check_delay_iflush(); \
  269.     }
  270.  
  271. #endif /* _KERNEL */
  272.  
  273. #endif /* __SYS_PDA_H__ */
  274.